import { DPIGroup } from "../types/types";

/**
 * 将GRB颜色数组转换为16进制颜色格式
 * @param grbColors GRB颜色数组 [G, R, B] 格式，每个值范围 0-255
 * @returns 16进制颜色字符串，例如 "#FF0000"
 */
export function grbToHex(grbColors: number[]): string {
  if (!Array.isArray(grbColors) || grbColors.length !== 3) {
    console.warn("Invalid GRB color array:", grbColors);
    return "#000000";
  }

  // 确保所有值在0-255范围内
  const validatedColors = grbColors.map((color) =>
    Math.min(255, Math.max(0, Math.floor(color)))
  );

  // GRB 转 RGB
  const [g, r, b] = validatedColors;

  // 转换为16进制并确保每个颜色都是两位数
  const toHex = (n: number): string => {
    const hex = n.toString(16);
    return hex.length === 1 ? "0" + hex : hex;
  };

  return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
}

/**
 * 将GRB颜色配置转换为16进制颜色数组
 * @param colors GRB颜色配置，格式为 [模式][档位][GRB]
 * @returns 16进制颜色数组，格式为 [模式][档位]
 */
export function convertGrbColorsToHex(colors: number[][][]): string[][] {
  if (!Array.isArray(colors)) {
    console.warn("Invalid colors configuration:", colors);
    return [];
  }

  return colors.map((modeColors) =>
    modeColors.map((dpiColors) => grbToHex(dpiColors))
  );
}

/**
 * 将16进制颜色转换为GRB格式
 * @param hex 16进制颜色字符串，例如 "#FF0000"
 * @returns GRB颜色数组 [G, R, B]
 */
export function hexToGrb(hex: string): number[] {
  const r = parseInt(hex.slice(1, 3), 16);
  const g = parseInt(hex.slice(3, 5), 16);
  const b = parseInt(hex.slice(5, 7), 16);

  return [g, r, b]; // GRB顺序
}

/**
 * 将GRB颜色数组和DPI值转换为DPIGroup数组
 * @param grbColors GRB颜色数组，格式为 [档位][GRB]
 * @param dpiValues DPI值数组
 * @returns DPIGroup数组
 */
export function convertToDPIGroups(
  grbColors: number[][],
  dpiValues: number[]
): DPIGroup[] {
  if (!Array.isArray(grbColors) || !Array.isArray(dpiValues)) {
    console.warn("Invalid input arrays:", { grbColors, dpiValues });
    return [];
  }

  return grbColors
    .map((grbColor, index) => {
      const dpiValue = dpiValues[index];

      const hexColor = grbToHex(grbColor);
      return {
        key: index.toString(),
        dpiIndex: index,
        dpiValue: dpiValue,
        dpiColor: hexColor,
        dpiBgColor: `${hexColor}1a`, // 添加透明度
      };
    })
    .map((group, index) => ({
      ...group,
      key: index.toString(), // 重新分配key和dpiIndex以保持连续性
      dpiIndex: index,
    }));
}
